// 单例模式
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>


typedef struct _data_tag
{
    void *pData;
}data_type;

// 对于c语言来说，饿汉式就是相当于全局变量了。
static data_type g_pData;


#if 0
// 这种懒汉式是单线程的，不能达到多线程的安全。
void* get_data()
{
    static data_type *pData = NULL;
    
    if(NULL != pData)
        return pData;
 
    pData = (data_type *)malloc(sizeof(data_type));
    assert(NULL != pData);
    return (void*)pData;

}
#endif
// 饿汉式的方式也可以, 这个函数式全局的， 大部分场景饿汉式就够用了。
void* get_data() 
{
    return &g_pData;
}
/**
* 下面文件介绍了不建议在c/c++里面使用双重检查的理由，但是硬要实现也可以使用内存屏障来解决
* https://blog.csdn.net/niino/article/details/112663004?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-4-112663004-blog-103880873.pc_relevant_multi_platform_whitelistv1&spm=1001.2101.3001.4242.3&utm_relevant_index=7
*/
int main()
{

    return 0;
}


// C++
#include <string.h>
#include <assert.h>
 
class object
{
public:
    static object* getInstatce()
    {
		return pObject;
    }
	
private:
    static object *pObject;  // 对象名私有
    object() {} // 构造函数私有
    ~object() {}
};
 
object *object::pObject = new object; // 在main函数之前开始初始化，饿汉式

int main()
{
    object *A = object::getInstatce();
    return 0;
}
